<?php

namespace app\common\service\fanyi;

use think\admin\extend\HttpExtend;

class BaiduFaiyi
{
    /**
     * api地址
     */
    private $url = 'http://api.fanyi.baidu.com/api/trans/vip/translate';

    protected $config = [
        // APP ID https://fanyi-api.baidu.com/manage/developer
        'appid' => '20220628001258709',
        // 密钥 https://fanyi-api.baidu.com/manage/developer
        'appkey' => 'NNh29gRh3fooWiLiiEI7',
        // 翻译源语言 https://fanyi-api.baidu.com/doc/21
        'fromLang' => 'auto',
        // 翻译目标语言 https://fanyi-api.baidu.com/doc/21
        'toLang' => 'en',
    ];

    /**
     * 错误信息
     */
    public $err;

    /**
     * 架构方法 设置参数
     * @param  array $config 配置参数
     */
    public function __construct($config = [])
    {
        $this->config = array_merge($this->config, $config);
    }

    /**
     * 获取错误信息
     * @return array
     */
    public function getErr()
    {
        return $this->err;
    }

    /**
     * 翻译
     * @var string $q 翻译字符
     * @return array
     */
    public function fanyi($q)
    {
        // 请求参数
        $param = [
            'q' => $q, // 请求翻译query
            'from' => $this->config['fromLang'], // 翻译源语言
            'to' => $this->config['toLang'], // 翻译目标语言
            'appid' => $this->config['appid'], // APPID
            'salt' => rand(10000, 99999), // 随机数
        ];
        // 设置加签
        $param = $this->setSign($param);
        //        return $param;
        $result = HttpExtend::post($this->url, $param);
        //        $result = '{"error_code":"54001","error_msg":"Invalid Sign"}';
        //        $result = '{"from":"zh","to":"en","trans_result":[{"src":"\u82f9\u679c","dst":"Apple"}]}';
        $result = json_decode($result, true);
        if (empty($result)) {
            $this->err = ['error_code' => '0', 'error_msg' => '请求失败',];
            return [];
        }
        if (empty($result['trans_result'])) {
            $this->err = $result;
            return [];
        }
        return array_column($result['trans_result'], 'dst');
    }


    /**
     * 设置签名
     * @var array $param 翻译字符
     * @return array
     */
    public function setSign($param)
    {
        // 获取签名
        $Sign = $this->getSign($param['q'], $param['salt']);
        $param['sign'] = $Sign;
        return $param;
    }


    /**
     * 生成签名
     * @var string $q 翻译字符
     * @var string $salt 随机数
     * @return string
     */
    public function getSign($q, $salt)
    {
        $Sign = md5($this->config['appid'] . $q . $salt . $this->config['appkey']);
        return $Sign;
    }

    /**
     * curl请求
     * @var string $url 请求地址
     * @var string $data 传输数据json
     * @var array $headers 请求头
     * @return string
     */
    public function http_request($url, $data = null, $headers = [])
    {
        $curl = curl_init();

        // curl参数配置-----------------------------------------
        $curl_params = [];
        //自定义header
        if (!empty($headers)) {
            $curl_params[CURLOPT_HTTPHEADER] = $headers;
        }
        $curl_params[CURLOPT_URL] = $url; //请求url地址
        // $curl_params[CURLOPT_HEADER] = false; //是否返回响应头信息
        $curl_params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
        // 	$curl_params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
        $curl_params[CURLOPT_MAXREDIRS] =  10; //指定最多的HTTP重定向的数量，这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。
        $curl_params[CURLOPT_ENCODING] = ''; //支持的编码有"identity"，"deflate"和"gzip"。如果为空字符串""，请求头会发送所有支持的编码类型
        // $curl_params[CURLOPT_TIMEOUT] = 0; //设置cURL允许执行的最长秒数
        // $curl_params[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1; //版本
        // $curl_params[CURLOPT_CONNECTTIMEOUT] = 5; //设置连接超时时间
        // 
        //如果有数据 则设置为post传输
        if (!empty($data)) {
            $curl_params[CURLOPT_CUSTOMREQUEST] = 'POST';
            $curl_params[CURLOPT_POSTFIELDS] =  $data;
        }
        //下两行禁用证书
        $curl_params[CURLOPT_SSL_VERIFYPEER] = false;
        $curl_params[CURLOPT_SSL_VERIFYHOST] = false;
        // curl参数配置-----------------------------------------

        curl_setopt_array($curl, $curl_params);
        $response = curl_exec($curl);
        curl_close($curl);
        return $response;
    }
}
